/* prekidi.S - osnovni prihvat prekida */
     
#define _ARH_PREKIDI_S_
#include "prekidi.h"
#include "spremnik.h"

.extern	arh_prekidna_f, arh_stog_aktivne, arh_prekidni_stog

.globl arh_prekidne_funkcije, izadji_iz_jezgre

.section .pocetak_koda

/* svi prekidi dolaze ovdje */

arh_prihvat_prekida:
	/* spremi segmentne registre */
	pushw	%ds
	pushw	%es
	pushw	%fs
	pushw	%gs

        mov     %esp, %ecx      /* zapamti vrh stoga = adresa konteksta */

        /* jezgrini registri za segmente */
        mov     $GDT_OPISNIK(SEGJ_PODACI, GDT, RAZINA_JEZGRE), %bx
        mov     %bx, %ds
        mov     %bx, %es
        mov     %bx, %fs
        mov     %bx, %gs
        
	mov	arh_prekidni_stog, %esp

	push   %ecx            /* adresa konteksta, 2. parametar ako treba */
	push   %eax            /* "id" prekida, 1. parametar funkcije */

	call	*arh_prekidna_f
	

	/* ako je PIC generirao prekid, dozvoli prihvat novih prekida */
	pop	%ebx            /* tu je sad "id" prekida */
	cmp	$PREKIDI_VANJSKI, %ebx
	jb	.1
	cmp	$PREKIDI_PROGRAMSKI, %ebx
	jae	.1
	movb	$PIC_EOI, %al
	outb	%al, $PIC1_CMD
	cmp	$PREKIDI_VANJSKI+7, %ebx
	jbe	.1
	outb	%al, $PIC2_CMD
.1:

izadji_iz_jezgre:
/* osim uobicajenog povratka u aktivnu dretvu, ova labela sluzi kao adresa koju
   koristi pocetna "dretva" (koja podize sve) da zavrsi svoje postojanje
 */

	mov	arh_stog_aktivne, %esp

	popw	%gs
	popw	%fs
	popw	%es
	popw	%ds

	popal

	add	$4, %esp	// makni kod greske

	iret

/* prekidne funkcije, preko "makroa" ih definiram */

.irp brpr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,\
        26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48

.type prekid_\brpr, @function
prekid_\brpr:

.if \brpr < 8 || \brpr == 9 || \brpr > 14
	pushl   $0	// zamjena za kod greske
.endif

	pushal
	mov	$\brpr, %eax
	jmp	arh_prihvat_prekida
.endr

/* kazaljke na funkcije, potrebne zbog zapisa u IDT (iz C-a) */

.section .data
.align	4
.type	arh_prekidne_funkcije, @object
.size	arh_prekidne_funkcije, 49*4

arh_prekidne_funkcije:
.irp brpr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,\
        26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48

	.long prekid_\brpr
.endr
	.long 0
